package com.tgz.util;

import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 * 生成指定位数随机字符串0-9，a-z, A-Z
 *
 * 线程安全
 *
 * @author Dylan Yim.
 * @since 2018/12/10.
 */
public class RandomString {

    private static final String NUMBER = "0123456789";
    private static final String LETTERS = "abcdefghijklmnopqrstuvwxyz";

    /**
     * 生成指定位数随机字符串，可包含数字，大写字母，小写字母
     *
     * @param count 位数
     * @return String
     */
    public static String random(int count) {
        return RandomStringUtils.random(count, NUMBER + LETTERS + StringUtils.upperCase(LETTERS));
    }

    /**
     * 生成指定位数字符串，只包含数字
     *
     * @param count 位数
     * @return String
     */
    public static String randomNumeric(int count) {
        return RandomStringUtils.random(count, NUMBER);
    }


    /**
     * 生成指定位数字符串，可包含大小写字母
     *
     * @param count 位数
     * @return String
     */
    public static String randomLetter(int count) {
        return RandomStringUtils.random(count, LETTERS + StringUtils.upperCase(LETTERS));
    }

    /**
     * 生成指定位数字符串，只包含小写字母
     *
     * @param count 位数
     * @return String
     */
    public static String randomLetterLowerCase(int count) {
        return RandomStringUtils.random(count, LETTERS);
    }

    /**
     * 生成指定位数字符串，只包大写字母
     *
     * @param count 位数
     * @return String
     */
    public static String randomLetterUpperCase(int count) {
        return RandomStringUtils.random(count, StringUtils.upperCase(LETTERS));
    }


    public static void main(String[] args) {
        ExecutorService exec = Executors.newCachedThreadPool();
        final Semaphore semaphore = new Semaphore(50);
        for (int i = 0; i < 200; i++) {
            exec.execute(() -> {
                try {
                    semaphore.acquire();
                    System.out.println(random(6));
                    semaphore.release();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
        exec.shutdown();
    }
}
